import time
import base64
import hmac


def get_token(key, expire=259200):
    '''
    :param key: str (用户给定的key，需要用户保存以便之后验证token,每次产生token时的key 都可以是同一个key) 
    :param expore: int(最大有效时间,单位为小时)
    :return: token
    '''
    ts_str = str(time.time() + expire)
    ts_byte = ts_str.encode('utf-8')
    sha1_tshexstr = hmac.new(key.encode('utf-8'), ts_byte, 'sha1').hexdigest()
    token = ts_str+":"+sha1_tshexstr
    b64_token = base64.b64encode(token.encode('utf-8'))
    return b64_token


def out_token(key, token):
    '''
    :param key: 服务器给的固定key
    :param token: 前端传过来的token
    :return: true,false
    '''
    try:
        token_str = base64.b64decode(token).decode('utf-8')
        token_list = token_str.split(':')
        if len(token_list) != 2:
            return False
        ts_str = token_list[0]
        if float(ts_str) < time.time():
            # token超时
            return False
        known_sha1_tsstr = token_list[1]
        sha1 = hmac.new(key.encode('utf-8'), ts_str.encode('utf-8'), 'sha1')
        calc_sha1_tsstr = sha1.hexdigest()
        if calc_sha1_tsstr != known_sha1_tsstr:
            # token错误
            return False
        return True
    except Exception as e:
        print("token解析出现异常:%s" % e)
